package cn.fl.customer.service;

import cmm.mid.core.framework.page.DataResultVO;
import cmm.mid.core.framework.page.KeyValueVO;
import cmm.mid.core.framework.page.Pager;
import cn.cmm.base.framework.exception.BaseException;
import cn.fl.customer.vo.*;
import fl.customer.facade.customer.condition.CstBscInfoQueryCondition;
import fl.customer.facade.customer.condition.CstCorpBscInfoQueryCondition;
import fl.customer.facade.customer.condition.CstCreditQC;
import fl.customer.facade.customer.condition.CstNpBscInfoQueryCondition;
import fl.customer.facade.customer.dto.CstBscInfoDTO;
import fl.customer.facade.customer.dto.CstNpSocialRlDTO;
import fl.spl.facade.mfr.dto.MfrInfoModDTO;
import net.sf.json.JSONArray;

import java.util.List;
import java.util.Map;

/**
 * @Description: 客户基础信息表 客户端服务层接口
 * @Description: 业务层方法名称前缀：新增：add* 删除：remove* 修改：modify* 查询对象：select* get* 查询集合：search*
 */
public interface ICstBscInfoService {
	
	/**
	 * 获取唯一对象
	 * @param id 主键
	 * @param buOrgCd 业务部
	 * @return 对象DTO
	 */
	public CstBscInfoVO selectById(Long id) throws BaseException;
	
	/**
	 * 获取唯一对象-带附属信息
	 * @param id 主键
	 * @param buOrgCd 业务部
	 * @return 对象DTO
	 */
	public CstBscInfoVO selectBy(Long id, String buOrgCd) throws BaseException;
	
	/**
	 * 详细信息获取唯一对象
	 * @param id 主键
	 * @return 对象DTO
	 */
	public CstBscInfoVO selectDetailById(Long id) throws BaseException;
	
	public CstBscInfoVO selectDetailBy(Long id,String orgCd,String buOrgCd) throws BaseException;
	/**
	 * 新增
	 * @param entity
	 * @return
	 */
    public Long add(CstBscInfoVO entity) throws BaseException;

    /**
     * 删除
     * @param id
     * @return
     */
    public boolean removeById(Long id)throws BaseException;
    
    /**
     * 删除
     * @param ids
     * @return
     */
    public boolean removeByIds(List<Long> ids)throws BaseException;
    
    /**
     * 修改
     * @param entity
     * @return
     */
    public boolean modify(CstBscInfoVO entity)throws BaseException;

    /**
     * 分页查询所有
     * @param page
     * @return
     */
    public Pager searchListPage(Pager page)throws BaseException;
    
    /**
     * 检查是否有客户的配偶信息
     * @param cstId 客户ID
     * @param rlTypCd 客户关系类型Code
     * @return 是否有客户关系配偶信息
     * @throws BaseException
     */
    public boolean checkCstNpSocialRlMarInfo(Long cstId, String rlTypCd)throws BaseException;
    
    /**
     * 客户状态<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchCstStsCdList()throws BaseException;
    
    /**
     * 客户类型<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchCstTypCdList()throws BaseException;
    
    /**
     * 客户营业执照<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchBusinessLicenceList()throws BaseException;
    
    /**
     * 客户级别<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchCstLvlCdList()throws BaseException;
    
    /**
     * 客户证件类型<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchCertTypCdList(String type)throws BaseException;
    
    public List<KeyValueVO> searchCertTypCdListZj(String attr1,String attr2)throws BaseException;
    
    /**
     * 客户文化程度<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchEduLvlCdList()throws BaseException;
    
    /**
     * 客户所属行业<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchIndCdList()throws BaseException;
    
    /**
     * 客户婚姻状况<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchMarStsCdList()throws BaseException;
    
    /**
     * 性别<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchGenderCdList()throws BaseException;
    
    /**
     * 法人-企业性质 <KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchCorpTypCdList()throws BaseException;
    
    /**
     * 注册资本计量单位 <KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchRegCapUntCdList()throws BaseException;
    
    /**
     * 实收资本计量单位 <KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchPaidCapUntCdList()throws BaseException;
    
    /**
     * 成员类型-职务 <KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchMTypCdList()throws BaseException;
    
    /**
     * 员工数量 <KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchEmpQtyCdList()throws BaseException;
    
    /**
     * 事业部集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchBusinessOrgList() throws BaseException;
    
	/**
	 * 验证客户身份证号码和名称是否有法律效应
	 * @param cstNm 客户姓名
	 * @param cstNo 客户身份证号
	 * @return 
	 * @throws Exception
	 */
    public CstValidCardInfoVO validateCstCert(String certNm,String certNo)throws BaseException;
    
    /**
     * 检查客户信息(自然人)是否存在
     * @param certNm 客户名称
     * @param certNo 证件号码
     * @param sysCd 系统代码
     * @return List<CstBscInfoVO>
     * @throws BaseException
     */
    public List<CstBscInfoVO> checkCstBscInfoNpIsHere(String certNm, String certNo, String certTypCd,String sysCd)throws BaseException;
    
    /**
     * 检查客户信息(法人)是否存在
     * @param certNm 客户名称
     * @param certNo 证件号码
     * @param certTypCd 证件类型
     * @param sysCd 系统代码
     * @return List<CstBscInfoVO>
     * @throws BaseException
     */
    public List<CstBscInfoVO> checkCstBscInfoCorpIsHere(String certNm, String certNo, String certTypCd, String sysCd)throws BaseException;
    
    /**
     * 根据手机号获取客户信息,用途验证手机号唯一
     * @param mp1 手机号1
     * @param mp2 手机号2
     * @param sysCd 系统代码
     * @return List<CstNpBscInfoVO>
     * @throws BaseException
     */
    public List<CstNpBscInfoVO> searchCstNpBscInfoWithMp(CstNpBscInfoQueryCondition qc)throws BaseException;
    
    
    /**
     * 根据证件号获取客户信息,用途验证证件号唯一
     * @param certNo 证件号码
     * @param sysCd 系统代码
     * @return List<CstBscInfoVO>
     * @throws BaseException
     */
    public List<CstBscInfoVO> searchCstBscInfoWithCertNo(CstBscInfoQueryCondition qc)throws BaseException;
    
    /**
     * 客户关系属性 <KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public JSONArray searchCstRlTypArray()throws BaseException;
    
    /**
     * 客户关系属性 <KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    public List<KeyValueVO> searchCstRlTypList()throws BaseException;
    
    /**
     * 根据所属机构数据字典Code获取字典树
     * @param dicCode 
     * @return
     * @throws BaseException
     */
    public JSONArray searchTreeByCd(String dicCode, String pCodeInitVal) throws BaseException;
    
    /**
     * 客户类型<KEY,VALUE>职业集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchOcpCdList()throws BaseException;
    
    /**
     * 客户类型<KEY,VALUE>职务集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchPosCdList()throws BaseException;
    
    /**
     * 客户类型<KEY,VALUE>职称集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchTitCdList()throws BaseException;
    
    /**
     * 是否类型<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchYNList()throws BaseException;
    /**
     *  客户关系<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     */
    public List<KeyValueVO> searchGrpRlTypCdList() throws BaseException ;

    /**
     * 是否实际还款人<KEY,VALUE>集合
     * @return <KEY,VALUE>集合
     * @throws BaseException
     */
    List<KeyValueVO> searchIsActualPayerCdList() throws BaseException;
    
    /**
     * 查询账户验证状态列表
     * @return List<KeyValueVO>
     */
    public List<KeyValueVO> searchValidStsList()throws BaseException ;
    
	/**
	 * 查询客户逾期记录
	 */
	public List<CstCreditVO> searchCreditList(CstCreditQC cstCreditQC)throws BaseException;
	
	/**
	 * 还款方式
	 */
    public List<KeyValueVO> searchPayTypCdList() throws BaseException ;
    
	/**
	 * 最高学历
	 */
    public List<KeyValueVO> searchHighDgCdList() throws BaseException ;
    
	/**
	 * 居住状况
	 */
    public List<KeyValueVO> searchLivCndCdList() throws BaseException ;
    
	/**
	 * 征信客户分级
	 */
    public List<KeyValueVO> searchZxCstLvlCdList() throws BaseException ;
    
    /**
     * 查询客户基本信息自然人新增页面字典项
     * @return
     * @throws BaseException
     */
    public Map<String, List<KeyValueVO>> searchCustCstBacInfoNpAddPageDicInfo(List<String> grpCdLi3st)throws BaseException ;
   
    /**
     * 查询自然人社会关系
     * @param condition
     * @throws BaseException
     */
    public CstNpSocialRlDTO searchCstNpSocialRlList(Long cstId, String rlTypCd) throws BaseException;

    /**
     * @MethodName checkMpAndCert
     * @Description: 三要素校验
     * @Author: wangpengtao@lionbridgecapital.cn
     * @CreateDate: 2019/6/22 17:15
     * @Version: V1.0.0
     * @Param usrNm
     * @Param certNo
     * @Param mp
     * @Return java.lang.Boolean
     * @UpdateRemark [序号][YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public Boolean checkMpAndCert(String usrNm, String certNo, String mp) throws BaseException;

        /**
         * 获取当前组织架构树
         */
    public JSONArray searchCurrentOrgWithChildTree()throws BaseException;
    
    public List<CstBscInfoVO> searchListByCon(CstBscInfoQueryCondition condition) throws BaseException;

    /**
     *
     *@Description 用户证件解绑
     *@Author shijb
     *@Date 2018/7/5 11:16
     *@Param certNo         证件号
     *@Param currentUserId  当前登录用户id
     *@return boolean
     **/
    public DataResultVO removeCertBind(String certNo, Long currentUserId) throws BaseException;
    /**
     *
     * @Description 分页查询所有客户
     * @Author shijb
     * @Date 2018/7/10 19:23
     * @Param [page]
     * @return cmm.mid.core.framework.page.Pager
     **/
	public Pager searchAllListPage(Pager page);

    /**
     * 条件查询法人信息
     * @param condition
     * @return
     * @throws BaseException
     */
	public List<CstCorpBscInfoVO> searchCstCorpBscInfoVOListByConditon(CstCorpBscInfoQueryCondition condition) throws BaseException;
	
	/**
	 * 同步修改客户基础信息  新增修改主表 修改详细表
	 * @param mfrInfoModDTO
	 * @param dto
	 * @return
	 * @throws BaseException
	 */
	public Long addCstInfoMod(MfrInfoModDTO mfrInfoModDTO, CstBscInfoDTO dto) throws BaseException;
	
	/**
	 * 客户主要信息变更流程中-再次修改（呈报人节点）
	 * @param entity
	 * @return
	 * @throws BaseException
	 */
	public boolean modifyCstBscAgain(CstBscInfoDTO entity,String modId) throws BaseException;
	
	/**
	 * 客户主要信息变更流程-获取客户信息
	 * @param id 主键
	 * @param buOrgCd 业务部
	 * @return 对象VO
	 */
	public CstBscInfoVO selectCstFlowById(Long id, Long modId, String buOrgCd) throws BaseException;

    /**
     * @MethodName selectCstCertNoNm
     * @Description: 通过id获取客户基本信息
     * @Author: wangpengtao@lionbridgecapital.cn
     * @CreateDate: 2020/3/3 17:22
     * @Version: V1.0.0
     * @Param id
     * @Return cn.fl.customer.vo.CstBscInfoVO
     * @UpdateRemark [序号][YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public CstBscInfoDTO selectCstCertNoNm(Long id) throws BaseException;

    /**
     * 获取唯一对象-带附属信息
     * @param id 主键
     * @param buOrgCd 业务部
     * @return 对象DTO
     */
    CstBscInfoDTO selectCstBscInfoById(Long id, String buOrgCd) throws BaseException;

    /**
     * 修改-带附属信息
     * @param entity
     * @return
     */
    boolean modifyCstBscInfo(CstBscInfoDTO entity)throws BaseException;
   
}
